use ratatui::{buffer::Buffer, layout::{Constraint, Direction, Layout, Rect}, widgets::Widget};

use super::{
    header,
    manager,
    status,
    tasks,
    Ctx, Input, Select};


/// root是应用的顶层渲染器
/// 布局管理  终端屏幕划分成头部，主体和状态栏
/// 条件渲染  根据应用状态 决定是否渲染哪些组件
/// 光标控制  根据输入框状态设置或者隐藏光标位置
pub struct Root<'a> {
	cx: &'a mut Ctx,
}

impl<'a> Root<'a> {
	pub fn new(cx: &'a mut Ctx) -> Self { Self { cx } }
}

impl<'a> Widget for Root<'a> {
	fn render(self, area: Rect, buf: &mut Buffer) {
        // 将屏幕垂直方向上分成三部分 上中下
		let chunks = Layout::default()
			.direction(Direction::Vertical)
			.constraints([
                Constraint::Length(1),    // 固定高度为1行
                Constraint::Min(0),      // 剩余空间表示占用所有可用的空间
                Constraint::Length(1)   // 固定高度为1行
            ].as_ref())
			.split(area);

        // 渲染基础组件
		header::Layout::new(self.cx).render(chunks[0], buf);    // 渲染header  导航栏  tab标签
		manager::Layout::new(self.cx).render(chunks[1], buf);   // 渲染文件管理器主体
		status::Layout::new(self.cx).render(chunks[2], buf);    // 渲染底部状态信息  当前路径 模式等
        ///  注意 manager这些组件只负责渲染 即便你注释了这些manager仍然在work只是你看不见了而已

        // 条件渲染覆盖组件
		if self.cx.tasks.visible {
			tasks::Layout::new(self.cx).render(area, buf);
		}

		if self.cx.select.visible {
			Select::new(self.cx).render(area, buf);
		}

		if self.cx.input.visible {
			Input::new(self.cx).render(area, buf);
			self.cx.cursor = Some(self.cx.input.cursor());
		} else {
			self.cx.cursor = None;
		}
	}
}
